var express = require('express');  // 引入express模块
var app = express()
var http = require('http').Server(app);
var io = require('socket.io')(http);   // 通过传递server（HTTP 服务器）对象来初始化实例。

var users = [];  // 全局user数组
var userInfo = [];


// express.static(__dirname + '/static') 将根目录下static文件开放为静态资源目录
app.use('/', express.static(__dirname + '/static'));


/* 
   emit发送事件，on注册监听事件；io为服务端，socket为客户端
   io.emit(foo); 会触发所有客户端用户的foo事件
   socket.emit(foo); 只触发当前客户端用户的foo事件
   io.on('funname', function()) 服务端注册监听事件
   socket.on('funname', function()) 客户端注册监听事件
   socket.broadcast.emit(foo); 触发除了当前客户端用户的其他用户的foo事件
*/
io.on('connection', function(socket) { // 用户连接时触发
  io.emit('disUser', userInfo);   // 展示在线人员

  // 登录，检测用户名是否重复
  socket.on('login', (user) => {
    if (users.indexOf(user.name) > -1) {   // 用户名是否存在
      socket.emit('loginError'); // 触发客户端的登录失败事件
    } else {
      users.push(user.name);   // 储存用户名称
      userInfo.push(user)   // 储存用户昵称和头像
      
      // 触发客户端成功登录事件
      socket.emit('loginSuccess');
      socket.nickname = user.name;

      // 向所有用户广播通知新用户进行房间
      io.emit('system', {
        name: user.name,
        status: '进入'
      });

      // 渲染右侧在线人员信息
      io.emit('disUser', userInfo);
      console.log('当前在线人数', users.length)
      

      //为客户端注册发送消息事件
      socket.on('sendMsg', (data) => {
        console.log('data====>>>>', data)
        let img = '';
        for(let i = 0; i < userInfo.length; i++) {
          if (userInfo[i].name == socket.nickname) {
            img = userInfo[i].img;
          }
        }
        // 向除了当前发表的客户端之外的其他用户广播
        socket.broadcast.emit('receiveMsg', {
          name: socket.nickname,
          img: img,
          msg: data.msg,
          color: data.color,
          type: data.type,
          side: 'left'
        });
        
        // 向发送者发送消息
        socket.emit('receiveMsg', {
          name: socket.nickname,
          img: img,
          msg: data.msg,
          color: data.color,
          type: data.type,
          side: 'right'
        });
      });
    }
  })

  // 发送窗口抖动
  socket.on('shake', ()=> {
    socket.emit('shake', {
        name: '您'
    });
    socket.broadcast.emit('shake', {
        name: socket.nickname
    });
  });

  // 断开连接时
  socket.on('disconnect', () => {
    var index = users.indexOf(socket.nickname); 
    if (index > -1 ) {  // 避免是undefined
      users.splice(index, 1);  // 删除用户信息
      userInfo.splice(index, 1);  // 删除用户信息

      io.emit('system', {  // 系统通知
          name: socket.nickname,
          status: '离开'
      });
      
      io.emit('disUser', userInfo);  // 重新渲染
      console.log('a user left.');
    }
  });


});

http.listen(3000, function(){   // 监听3000端口
  console.log('listening on *:3000'); 
}); 
